package com.zisu.a996.guava;

import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.junit.Test;

import javax.swing.table.TableRowSorter;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 * @Author: 蔡翔
 * @Date: 2019/12/1 11:06
 * @Version 1.0
 */
public class SetsTest {
    /**
     * Sets工具类的常用方法
     * 并集 / 交集 / 差集 / 分解集合中的所有子集 / 求两个集合的笛卡尔积
     **/
    private static final Set set1 = Sets.newHashSet(1,2,3,4);
    private static final Set set2 = Sets.newHashSet(4,5,6,7);

    //并集
    @Test
    public void union(){
        Set<Integer> set = Sets.union(set1,set2);
        System.out.println(set);
    }

    //交集
    @Test
    public void intersection(){
        Set<Integer> set = Sets.intersection(set1,set2);
        System.out.println(set);
    }

    //差集
    @Test
    public void difference(){
        // set1 中存在的元素，在set2中不存在的元素，会被 放到set 集合中
        Set<Integer> set = Sets.difference(set1,set2);
        System.out.println(set);
        //[1, 2, 3]

        //元素在set1中不在set2中就会被返回 + 元素在set2中不在set1中就会被返回  =  总返回的
        set = Sets.symmetricDifference(set1,set2);
        System.out.println(set);
        //[1, 2, 3, 5, 6, 7]
    }


    //拆解集合，把一个集合拆 成 所有可能存在的子集合
    @Test
    public void powerSet(){
        Set<Set<Integer>> set = Sets.powerSet(set1);
        System.out.println(JSON.toJSONString(set));
        //[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3],[4],[1,4],[2,4],[1,2,4],[3,4],[1,3,4],[2,3,4],[1,2,3,4]]
    }

    //两个集合 笛卡尔积
    @Test
    public void cartesianProduct(){
        Set<Set<Integer>> set = Sets.cartesianProduct(set1,set2);
        System.out.println(JSON.toJSONString(set));
        //[[1,4],[1,5],[1,6],[1,7],[2,4],[2,5],[2,6],[2,7],[3,4],[3,5],[3,6],[3,7],[4,4],[4,5],[4,6],[4,7]]
    }

    /**
     * Lists 工具类的常用方法
     *  反转 / 拆分
     **/
    //给list 分组
    @Test
    public void partition(){
        List<Integer> list = Lists.newArrayList(1,2,3,4,5);
        //把list 分成2个 2个为一组。
        final List<List<Integer>> partition = Lists.partition(list, 2);
        System.out.println(JSON.toJSONString(partition, true));
    }

    //反转
    @Test
    public void reverse(){
        LinkedList<Integer> list = Lists.newLinkedList();
        list.add(1);
        list.add(2);
        list.add(3);

        final List<Integer> reverse = Lists.reverse(list);
        System.out.println(reverse);
    }

}
